#include <16F819.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES PUT                      //Power Up Timer
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=8000000)
#use i2c(Slave,Slow,sda=PIN_B1,scl=PIN_B4,address=0x84)
int8 incoming;
static int8 flag=3;
static int8 count=0;

#int_TIMER1
void  TIMER1_isr(void) 
{
count++;
if(count==2){
output_toggle(PIN_A3);
count=0;
}
}

#int_SSP
void  SSP_isr(void) 
{
	int8  state;
	output_low(PIN_A1);
	state = i2c_isr_state();
   
	if(state < 0x80)     // Master is sending data
	{
		flag --;
		incoming = i2c_read(); 
		
	}

	if(state >= 0x80)   // Master is requesting data from slave
	{
		i2c_write(42);
	} 

}



void main()
{

   int8 contador=0;  //La bandera se usa para saber cual es el dato que llega
   				//el contador es una especie de timeout
   int8 posicion,velocidad;
   
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   setup_timer_2(T2_DISABLED,0,1);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);
   setup_oscillator(OSC_8MHZ);

   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL); 
   output_high(PIN_A1);
   while(1)
   {
	while(contador<250)
	{
		//Estoy esperando los datos de vel y pos para este servo
		
		if(flag==2)
		{
			posicion=incoming;
		}
		if(flag==1)
		{
			velocidad=incoming;
		}
		while(flag==0)
		{
			//proceso de manejar velocidades y posicionamiento del servo
			delay_ms(1000*posicion);
			output_toggle(PIN_A1);
			delay_ms(1000*velocidad);
			output_toggle(PIN_A1);
			flag=3;
		}
		contador++;
	}
	  if(contador>=250)
	  {
		  flag=3;  //reseteamos la bandera, hubo un error al enviar
		  //hay que avisar al maestros que hubo un error de recepcion
		  //o que los datos no estan completos
	  } 
   }

}

